#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>

// 声明全局信号量
sem_t *sem;

// 定义多个线程共享的数据缓冲区
char message[100];

// 写线程：向共享缓冲区写入一个字符串
void *writer(void *argv)
{
    strcpy(message, "atguigu");
    printf("writer线程写入数据: atguigu \n");

    // 信号操作(也称：执行V操作)
    // 将信号量值加1，因为信号量阻塞的线程就会被唤醒
    sem_post(sem);

    return NULL;
}

// 读线程：从共享缓冲区读取数据显示，并重置缓冲区
void *reader(void *argv)
{
    // 等待信号量(也称：执行P操作)
    // 如果信号量>0, 信号量减1,函数返回向下执行
    // 如果信号量=0, 阻塞等待直至信号量>0
    sem_wait(sem);

    // 读取缓冲区数据显示
    printf("reader线程读取数据: %s\n", message);
    // 重置缓冲区
    memset(message, 0, 100);

    return NULL;
}

int main()
{
    // 为信号量分配空间
    sem = malloc(sizeof(sem_t));

    // 初始化信号量 0：线程间共享 0：初始值
    sem_init(sem, 0, 0);

    // 线程唯一标识符
    pthread_t thread_read, thread_write;

    // 创建读和写的2个线程
    pthread_create(&thread_read, NULL, reader, NULL);
    pthread_create(&thread_write, NULL, writer, NULL);

    // 等待线程结束
    pthread_join(thread_write, NULL);
    pthread_join(thread_read, NULL);

    // 销毁信号量
    sem_destroy(sem);

    // 释放内存空间
    free(sem);

    return 0;
}